import axios from 'axios';
import { message } from 'antd';

// 动态获取 API 地址
// 在生产环境中，使用当前域名的 7661 端口
// 在开发环境中，使用 localhost:7661
const getApiBaseUrl = () => {
  if (process.env.NODE_ENV === 'production') {
    // 生产环境：使用当前访问的主机名 + 7661 端口
    const protocol = window.location.protocol;
    const hostname = window.location.hostname;
    return `${protocol}//${hostname}:7661/api`;
  }
  // 开发环境：使用环境变量或默认值
  return process.env.REACT_APP_API_URL || 'http://localhost:7661/api';
};

const request = axios.create({
  baseURL: getApiBaseUrl(),
  timeout: 30000,
  headers: {
    'Content-Type': 'application/json'
  }
});

// 请求拦截器
request.interceptors.request.use(
  config => {
    // 公开 API 不需要 token
    if (!config.url.includes('/public/')) {
      // 添加 token
      const token = localStorage.getItem('token');
      if (token) {
        config.headers.Authorization = `Bearer ${token}`;
      }
    }
    return config;
  },
  error => {
    console.error('请求错误:', error);
    return Promise.reject(error);
  }
);

// 响应拦截器
request.interceptors.response.use(
  response => {
    return response.data;
  },
  error => {
    if (error.response) {
      const { status, data } = error.response;
      
      switch (status) {
        case 400:
          message.error(data.message || '请求参数错误');
          break;
        case 401:
          // 如果是公开 API，不跳转登录页
          if (!error.config.url.includes('/public/')) {
            message.error('未登录或登录已过期');
            localStorage.removeItem('token');
            window.location.href = '/login';
          }
          break;
        case 413:
          message.error('文件过大，请上传小于10MB的文件');
          break;
        case 500:
          message.error('服务器错误，请稍后重试');
          break;
        case 503:
          message.error('数据库服务不可用');
          break;
        default:
          message.error(data.message || '请求失败');
      }
    } else if (error.request) {
      message.error('网络错误，请检查网络连接');
    } else {
      message.error('请求配置错误');
    }
    
    return Promise.reject(error);
  }
);

export default request;
